// 版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式的约束
// 可以在许可证文件中找到的许可证。

// 围棋：建造阿佩金
// +建造外观

// 软件包实现了在加密技术中经常有用的函数
// 但需要仔细考虑才能正确使用。
// None
// 这是golang.org/x/crypto/internal/minute的镜像。
package subtle // 导入“加密/内部/细微”

// 这是基于reflect的Google应用程序引擎标准变体
// 因为不安全的软件包和cgo是不允许的。

import "reflect"

// AnyOverlap报告x和y是否在任何位置共享内存（不一定
// 对应的）索引。超出片长度的内存将被忽略。
func AnyOverlap(x, y []byte) bool {
	return len(x) > 0 && len(y) > 0 &&
		reflect.ValueOf(&x[0]).Pointer() <= reflect.ValueOf(&y[len(y)-1]).Pointer() &&
		reflect.ValueOf(&y[0]).Pointer() <= reflect.ValueOf(&x[len(x)-1]).Pointer()
}

// InExactorVerLap报告x和y是否在任何非对应位置共享内存
// 指数超出片长度的内存将被忽略。请注意，x和y可以
// 具有不同的长度，但仍然没有任何不精确的重叠。
// None
// 可以使用IncexactorLap来实现加密/密码的要求
// AEAD、块、块模式和流接口。
func InexactOverlap(x, y []byte) bool {
	if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] {
		return false
	}
	return AnyOverlap(x, y)
}
